iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0

Django 文件在提到佈署的時候,建議不要使用 Django 來服務靜態的檔案,靜態的檔案讓專業的網頁伺服器 - Nginx / Apache 來處理比較有效率。但也有人認為這其實無傷,而且讓 Django 來處理也有不少好處,其中一個好處就是便於 Docker 容器化,所以就有了 WhiteNoise

除了便於容器化之外,一些 PaaS,例如 Heroku 的佈署 Django 教學也建議使用 WhiteNoise 。

專案文件網址:http://whitenoise.evans.io/en/stable/

安裝

poetry add whitenoise

設定與使用

# settings
MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

設定這邊要注意幾件事情:

  1. whitenoise.middleware.WhiteNoiseMiddleware 必須在 SecurityMiddleware 之後。
  2. 要設定 STATIC_ROOT
  3. 把靜態檔案放到 static 資料夾裡,然後設定 STATICFILES_DIRS 。
  4. 要設定 STATICFILES_STORAGE ,設定 STATICFILES_STORAGE 以後,WhiteNoise 會幫你把這些靜態檔案進行壓縮,並且加入適當的 Cache 指示,以減輕網路流量。CompressedManifestStaticFilesStorage 是表示壓縮,並且會有 Cache;你也可以改用 CompressedStaticFilesStorage ,這就不加入 Cache 指示了。

基本上這樣就完成了。

P.S. 以正式環境執行時,要記得執行 manage.py collectstatic,將靜態檔案收集到 STATIC_ROOT 所指定的資料夾去,否則會有 Internal server error (我查了好一會才想到是這個原因)。

進階 - 使用 CDN

使用 CDN 的話,要設置 STATIC_URL:

# settings
import environ

# ...
env = environ.Env()
# ...

STATIC_HOST = env('DJANGO_STATIC_HOST', default='')
STATIC_URL = STATIC_HOST + '/static/'

像上面這段,就增加了 STATIC_HOST,從環境變數來讀取。假設環境變數 DJANGO_STATIC_HOST 是 "https://mycdn.cloudfront.net" 。在 template 裡,我們會使用 {% static 'xxx.css' %} 來表明要引用哪個靜態檔案,實際上輸出的結果會是 STATIC_URL 裡的內容再加上你所引用的檔案,所以前面提到的 {% static 'xxx.css' %} 會變成 https://mycdn.cloudfront.net/static/xxx.css

進階 - 改用 brotli 壓縮法

關於 brotli 壓縮法,可以看 gslin 在 2015 年分享的「Google 推出 Brotli 無損壓縮法」,簡單的說,瀏覽器是使用 Gzip 來壓縮 / 解壓縮,Google 推出的 Brotli 壓縮法的壓縮率更好,而且不影響速度。

要使用 brotli 也很簡單,在安裝時,使用下面指令來安裝就可以了。

poetry add "whitenoise[brotli]"

安裝以後,whitenoise 會自動偵測 brotli 套件,並且使用,無需我們費心。

結語

whitenoise 不只可以用在 Django 上,也可以用在 Flask 上,關於 Flask 的部份可以參考這篇:Using WhiteNoise with Flask — WhiteNoise 5.2.0 documentation , whitenoise 就介紹到這裡囉。

範例程式碼網址:https://github.com/elleryq/ithome-iron-2020-django/tree/day-23


上一篇
22. django-allauth
下一篇
24. celery
系列文
加速你的 Django 網站開發 - Django 的好用套件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言